#ifndef __STRING_EXTENSION_HPP__
#define __STRING_EXTENSION_HPP__

#include <string>
#include <vector>
#include <algorithm>
#include <stdexcept>

class EStringList;

class EString : public std::string 
{
public:
    using std::string::string;

    EString(const std::string&);
    EString(const char*);
    EString(std::string&&);
    
    void replace(const EString& from, const EString& to);
    EString replaced(const EString& from, const EString& to);

    EStringList split(const EString& sep = " ") const;
    
    bool startsWith(const EString& prefix) const;
    bool endsWith(const EString& suffix) const;
    
    EString toLower() const;
    EString toUpper() const;
    EString trimmed() const;
};

class EStringList : public std::vector<EString>
{
public:
    using std::vector<EString>::vector;
    
    EString join(const EString& sep) const;
    
    bool contains(const EString& str) const;
    
    EStringList& removeDuplicates();
    
    EStringList& sort();
};

#endif // __STRING_EXTENSION_HPP__